# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.神笔库.元素库 import *
from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


def 偏移处理(x, y):
    def decorator(func):
        def wrapper(*args, **kwargs):
            results = func(*args, **kwargs)
            _results = []
            for r in results:
                result = list(r)
                if result[0] in ["移动", "直线", "矩形"]:
                    result[1] = result[1] + x
                    result[2] = result[2] + y
                elif result[0] in ["水平线"]:
                    result[1] = result[1] + x
                elif result[0] in ["垂直线"]:
                    result[1] = result[1] + y
                elif isinstance(r, str):
                    pass
                elif len(r) == 2:
                    result[0] = result[0] + x
                    result[1] = result[1] + y
                _results.append(tuple(result))
            return _results

        return wrapper

    return decorator


偏移X, 偏移Y = 120, 120

# 偏移X, 偏移Y = 0, 0


class 室内设计高清图制作(神笔绘图板):
    def __init__(self, 作品文件路径, 宽, 高):
        super(室内设计高清图制作, self).__init__(作品文件路径=作品文件路径, 宽=宽, 高=高)

        self.显示图框()
        # self.显示网格(网格线距=20, 网格字体大小=12)
        # self.贴图(0, 0, 资源库目录("图片/户型图.jpg"), 缩放=0.45, 透明度=0.3)

    # region 代码保留
    # def 画矩形(self, x, y, 宽, 高):
    #     偏移X, 偏移Y = 130, 130
    #     super(室内设计高清图制作, self).画矩形(x=x, y=y, 宽=宽, 高=高)
    #     print(f"        # self.画矩形(x={x}, y={y}, 宽={宽}, 高={高})")
    #     print(f"        self.画矩形(x=偏移X+{x-偏移X}, y=偏移Y+{y-偏移Y}, 宽={宽}, 高={高})")
    #     print("")

    # def 连线(self, 点列表, 描边颜色=颜色.黑色, 填充颜色=颜色.透明, 描边宽度=1, 闭合=False, 透明度=1.0, 描边样式=None, 模糊=0,
    #        点定位=False, 点定位坐标=False, 转相对坐标=True, 线条无缩放=False, id_=None):
    #     super(室内设计高清图制作, self).连线(点列表, 点定位=点定位, 点定位坐标=点定位坐标, 闭合=闭合)
    #     偏移X, 偏移Y = 130, 130
    #     code_ = " self.连线(["
    #     for 点 in 点列表:
    #         if 点[0] in ["移动", "直线"]:
    #             code_ += f'("{点[0]}", 偏移X+{点[1] - 偏移X}, 偏移Y+{点[2] - 偏移Y}), \n'
    #         elif 点[0] == "水平线":
    #             code_ += f'("{点[0]}", 偏移X+{点[1] - 偏移X}), \n'
    #         elif 点[0] == "垂直线":
    #             code_ += f'("{点[0]}", 偏移Y+{点[1] - 偏移Y}), \n'
    #         else:
    #             code_ += f"{点[0]}????"
    #     code_ += "])"
    #     print(code_)

    # endregion

    @偏移处理(x=偏移X, y=偏移Y)
    def 外轮廓(self):
        return [(65, 0), ("水平线", 1558.5), ("垂直线", 880),
                ("水平线", 1558.5 - 500), ("垂直线", 690),
                ("水平线", 140), ("垂直线", 370),
                ("水平线", 65), (0, 170), ("闭合"), ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 阳台轮廓(self):
        return [("移动", 142, 21),  # 阳台
                ("水平线", 79),
                ("直线", 24, 170),
                ("直线", 80, 347),
                ("水平线", 142),
                ("闭合"), ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 客厅(self):
        return [("移动", 812, 21),  # 客厅 (已经测量)
                ("垂直线", 501), ("水平线", 1528),
                ("垂直线", 226), ("水平线", 1263),
                ("垂直线", 21),
                ("闭合"), ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 走道(self):
        return [("移动", 611, 256),  # 走道
                ("垂直线", 670),
                ("水平线", 731),  # (已经测量)
                ("垂直线", 495),  # (已经测量)
                ("水平线", 781),  # (已经测量)
                ("垂直线", 256),
                ("闭合"), ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 厨房门(self):
        return [("移动", 1263, 166),  # 厨房门
                ("垂直线", 166 + 60),
                ("水平线", 1263 + 150),
                ("垂直线", 166 + 40),
                ("水平线", 1263 + 22),
                ("垂直线", 166), ("闭合"), ]

    def 绘制房间(self):
        self.连线(
            self.外轮廓() + self.阳台轮廓() + self.客厅() + self.走道() + self.厨房门() + self.矩形区域()
            + self.门() + self.窗()
            , 闭合=是, 描边宽度=0.5, 描边颜色=颜色.灰色, 填充颜色=颜色.黄褐色).阴影(偏移=(0, 0), 模糊度=8)
        #
        # self.绘制钢琴(x=偏移X + 180, y=偏移Y + 590, 旋转角度=180).阴影(偏移=(0, 0), 模糊度=2)
        # self.绘制床(x=偏移X + 380, y=偏移Y + 448, 长=210, 宽=110, 竖着=是).阴影(偏移=(0, 0), 模糊度=3)
        # self.绘制桌子(x=偏移X + 323, y=偏移Y + 410).旋转(180).阴影(偏移=(0, 0), 模糊度=3)

    @偏移处理(x=偏移X, y=偏移Y)
    def 矩形区域(self):
        return [
            ("矩形", 618, 21, 150, 215, "逆时针"),  # 上厕(已经测量)
            ("矩形", 151, 21, 433, 320, "逆时针"),  # 上卧房(已经测量)
            ("矩形", 166, 375, 418, 284, "逆时针"),  # 上书房(已经测量)
            ("矩形", 751, 521, 156, 158, "逆时针"),  # 下厕(已经测量)
            ("矩形", 915, 521, 144, 158, "逆时针"),  # 下洗手间(已经测量)
            ("矩形", 1088, 521, 440, 337, "逆时针"),  # 下主卧(已经测量)
            ("矩形", 1285, 21, 242, 185, "逆时针"),  # 厨房(已经测量)

        ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 门(self):
        return [
            ("矩形", 618, 670, 106, 20, "逆时针"),  # 大门

            ("矩形", 584, 260, 27, 78, "逆时针"),  # 上卧房门
            ("矩形", 584, 380, 27, 78, "逆时针"),  # 上书房门

            ("矩形", 584, 168, 34, 60, "逆时针"),  # 上厕门

            ("矩形", 781, 373, 31, 122, "逆时针"),  # 梯
            ("矩形", 925, 501, 125, 20, "逆时针"),  # 下厕门
            ("矩形", 1130, 501, 78, 20, "逆时针"),  # 下主卧门

            ("矩形", 142, 29, 9, 305, "逆时针"),  # 阳台拉门

            ("矩形", 907, 530, 8, 60, "逆时针"),  # 下卫生间门
        ]

    def 窗户路径(self, x, y, 宽, 高):
        if 宽 > 高:
            Y间距 = 高 // 3
            return [("矩形", x, y, 宽, 高, "逆时针"),
                    ("移动", x, y + Y间距), ("水平线", x + 宽), ("闭合"),
                    ("移动", x, y + 高 - Y间距), ("水平线", x + 宽), ("闭合"),
                    ]
        else:
            X间距 = 宽 // 3
            return [("矩形", x, y, 宽, 高, "逆时针"),
                    ("移动", x + X间距, y), ("垂直线", y + 高), ("闭合"),
                    ("移动", x + 宽 - X间距, y), ("垂直线", y + 高), ("闭合"),
                    ]

    def distance(self, x1, y1, x2, y2):
        dx = x1 - x2
        dy = y1 - y2
        d = pow(dx * dx + dy * dy, 1 / 2)
        return d

    def interpolate_points(self, x1, y1, x2, y2):
        # Calculate the coordinates at 1/3 and 2/3 of the line segment
        x_1_3 = x1 + (1 / 3) * (x2 - x1)
        y_1_3 = y1 + (1 / 3) * (y2 - y1)
        x_2_3 = x1 + (2 / 3) * (x2 - x1)
        y_2_3 = y1 + (2 / 3) * (y2 - y1)
        return (round(x_1_3, 2), round(y_1_3, 2)), (round(x_2_3, 2), round(y_2_3, 2))

    def 斜窗户路径(self, x1, y1, x2, y2, x3, y3, x4, y4):
        d1 = self.distance(x1, y1, x2, y2)
        d2 = self.distance(x3, y3, x2, y2)
        if d1 < d2:
            p_1_3, p_2_3 = self.interpolate_points(x1, y1, x2, y2)
            q_1_3, q_2_3 = self.interpolate_points(x4, y4, x3, y3)
        else:
            p_1_3, p_2_3 = self.interpolate_points(x2, y2, x3, y3)
            q_1_3, q_2_3 = self.interpolate_points(x1, y1, x4, y4)

        return [("移动", x1, y1),
                ("直线", x2, y2),
                ("直线", x3, y3),
                ("直线", x4, y4),
                ("闭合"),
                ("移动", p_1_3[0], p_1_3[1]),
                ("直线", q_1_3[0], q_1_3[1]),
                ("移动", p_2_3[0], p_2_3[1]),
                ("直线", q_2_3[0], q_2_3[1]), ]

    @偏移处理(x=偏移X, y=偏移Y)
    def 窗(self):
        阳台窗 = self.斜窗户路径(60, 13, 4, 160, 24, 169, 79, 20) + self.斜窗户路径(2, 177, 60, 353, 80, 346, 24, 170)

        return 阳台窗 + self.窗户路径(140, 418, 26, 140) + self.窗户路径(1527, 70, 31, 84) + \
               self.窗户路径(1528, 279, 30, 140) + self.窗户路径(1528, 618, 30, 140)

    def 绘制床(self, x, y, 长=200, 宽=180, 竖着=否, 旋转角度=0) -> SVG图元素:
        if 竖着:
            宽, 高 = 宽, 长
        else:
            宽, 高 = 长, 宽
        return self.SVG贴图(x=x, y=y, 图片文件=资源库目录("室内设计/单人床_110.svg"), 宽=宽, 高=高)
        # 床_ = self.画矩形(x=x, y=y, 宽=宽, 高=高, 描边宽度=1, 填充颜色=颜色.黄色, 圆角半径=5)  #

    def 绘制桌子(self, x, y) -> SVG图元素:
        return self.SVG贴图(x=x, y=y, 图片文件=资源库目录("室内设计/桌子1.svg"), 宽=186, 高=122). \
            颜色替换("white", 颜色.亮肉色).垂直翻转().旋转(-90)

    def 绘制钢琴(self, x, y, 竖着=否, 旋转角度=0) -> 元素:
        # https://www.svgrepo.com/vectors/piano/
        if 竖着:
            宽, 高 = 63, 150
            键盘_宽, 键盘_高 = 宽 / 2 - 5, 高 - 20
            键盘_x, 键盘_y = x + 宽 / 2, y + 10
        else:
            宽, 高 = 150, 63
            键盘_宽, 键盘_高 = 宽 - 20, 高 / 2 - 5
            键盘_x, 键盘_y = x + 10, y + 高 / 2

        钢琴体_ = self.画矩形(x=x, y=y, 宽=宽, 高=高, 描边宽度=2, 填充颜色=颜色.黑色, 圆角半径=5)  #

        钢琴元素列表 = [钢琴体_]
        键盘数 = 20
        for i in range(int(键盘数 / 2)):
            if 竖着:
                键盘_高度 = 键盘_高 / 键盘数 * 2
                白键盘_ = self.画矩形(x=键盘_x, y=键盘_y + i * 键盘_高度, 宽=键盘_宽, 高=键盘_高度 - 1, 描边宽度=0.5, 填充颜色=颜色.白色)  #
            else:
                键盘_宽度 = 键盘_宽 / 键盘数 * 2
                白键盘_ = self.画矩形(x=键盘_x + i * 键盘_宽度, y=键盘_y, 宽=键盘_宽度 - 1, 高=键盘_高, 描边宽度=0.5, 填充颜色=颜色.白色)  #
            钢琴元素列表.append(白键盘_)

        for i in range(int(键盘数 / 2)):
            if i in [2, 6, 9]:
                continue
            if 竖着:
                键盘_高度 = 键盘_高 / 键盘数 * 2
                黑键盘_ = self.画矩形(x=键盘_x - 2, y=键盘_y + (i + 0.5) * 键盘_高度 + 3, 宽=键盘_宽 - 8, 高=键盘_高度 - 6, 描边宽度=0.5,
                                填充颜色=颜色.黑色)  #
            else:
                键盘_宽度 = 键盘_宽 / 键盘数 * 2
                黑键盘_ = self.画矩形(x=键盘_x + (i + 0.5) * 键盘_宽度 + 3, y=键盘_y - 2, 宽=键盘_宽度 - 6, 高=键盘_高 - 8, 描边宽度=0.5,
                                填充颜色=颜色.黑色)  #

            钢琴元素列表.append(黑键盘_)

        钢琴_ = self.创建组合(元素列表=钢琴元素列表)
        if 旋转角度 != 0:
            钢琴_.旋转(旋转角度)
        return 钢琴_

    def 创作(self):
        self.绘制房间()
        # 户型图.jpg


if __name__ == '__main__':
    # 单位：厘米
    室内设计高清图 = 室内设计高清图制作("室内设计高清图.svg", 宽=1800, 高=1100)
    室内设计高清图.完成()
